<?php
namespace App\Services\Tools;

use App\Exceptions\BasicException;
use Firebase\JWT\JWT;

class JwtService
{


    /*
        iss 【issuer】签发人(可以是,发布者的url地址)
        sub 【subject】该JWT所面向的用户，用于处理特定应用，不是常用的字段
        aud 【audience】受众人（可以是客户端的url地址，用作验证是否是指定的人或者url）
        exp 【expiration】 该jwt销毁的时间；unix时间戳
        nbf 【not before】 该jwt的使用时间不能早于该时间；unix时间戳
        iat 【issued at】 该jwt的发布时间；unix 时间戳
        jti 【JWT ID】 该jwt的唯一ID编号
    */

    // 秘钥
    protected $key = "5b6F5Yiw5bGx6Iqx54OC5ryr5pe277yM5aW55Zyo5Lib5Lit56yR";

    /**
     * 解码
     */
    public function decode(string $token)
    {
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, $this->key, ['HS256']); //HS256方式，这里要和签发的时候对应
            return (array)$decoded;
        } catch(\Firebase\JWT\SignatureInvalidException $s) {  //签名不正确
            //throw new Exception($s->getMessage());
            return $s->getMessage();
        }catch(\Firebase\JWT\BeforeValidException $b) {  // 签名在某个时间点之后才能用
            //throw new Exception($b->getMessage());
            return $b->getMessage();
        }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
            //throw new Exception($e->getMessage());
            return $e->getMessage();
        }catch(\Exception $e) {  //其他错误
            //throw new Exception($e->getMessage());
            return $e->getMessage();
        }
    }

}

?>
